/****************************************Copyright (c)*************************
**                               版权所有 (C), 2015-2020, 涂鸦科技
**
**                                 http://www.tuya.com
**
**--------------文件信息-------------------------------------------------------
**文   件   名: system.c
**描        述: wifi数据处理函数
**使 用 说 明 : 用户无需关心该文件实现内容
**
**
**--------------当前版本修订---------------------------------------------------
** 版    本: v1.0.1
** 日　  期: 2020年2月26日
** 修改人员: 周猛
** 协议版本: v1.1.1
** 描　  述: 1:产品信息新增tp字段和p字段
             2:修改product_info_update函数，新增参数ver来选择是否支持获取产品pid
               将组包格式由JSON格式换成sprintf，以减轻MCU资源压力
             3:增加带传入帧版本的串口数据发送函数wifi_uart_write_frame_ver
             4:在wifi_uart_service函数中，取消了串口数据对帧版本的校验

** 版    本: v1.0.0
** 日　  期: 2019年7月27日
** 修改人员: 陈力恒
** 协议版本: v1.1.1
** 描　  述: 1:gateway通用协议mcu_sdk初版
**-----------------------------------------------------------------------------
******************************************************************************/

#ifndef __SYSTEM_H_
#define __SYSTEM_H_

#ifdef SYSTEM_GLOBAL
  #define SYSTEM_EXTERN
#else
  #define SYSTEM_EXTERN   extern
#endif

//=============================================================================
//帧的字节顺序
//=============================================================================
#define         HEAD_FIRST                      0
#define         HEAD_SECOND                     1
#define         PROTOCOL_VERSION                2
#define         FRAME_TYPE                      3
#define         LENGTH_HIGH                     4
#define         LENGTH_LOW                      5
#define         DATA_START                      6

//=============================================================================
//数据帧类型
//=============================================================================
#define         PRODUCT_INFO_CMD                1                               //产品信息
#define         WORK_MODE_CMD                   2                               //查询MCU 设定的模块工作模式	
#define         WIFI_STATE_CMD                  3                               //wifi工作状态	
#define         WIFI_RESET_CMD                  4                               //重置wifi
#define         WIFI_MODE_CMD                   5                               //选择smartconfig/AP模式	
#define         PERMIT_SUBDEVICE_NETIN_CMD      6                               //允许子设备入网
#define         CLOSE_SUBDEVICE_NETIN_CMD       7                               //关闭子设备入网
#define         SUBDEVICE_ADD_CMD               8                               //子设备添加
#define         SUBDEVICE_DELETTE_CMD           9                               //子设备删除
#define         HEART_CHECK_CMD                 0x0a                            //心跳检测
#define         STATE_QUERY_CMD                 0x0b                            //状态查询（用于同步设子设备状态）
#define         DATA_ISSUED_CMD                 0x0c                            //命令下发
#define         STATE_UPLOAD_CMD                0x0d                            //状态上报
#define         GET_ONLINE_TIME_CMD             0x10                            //获取系统时间(格林威治时间)
#define         GET_LOCAL_TIME_CMD              0x11                            //获取本地时间
#define         BATCH_ADD_DEV_CMD               0x12                            //批量添加设备
#define         ADD_DEV_RESULT_CMD              0x13                            //返回添加设备结果
#define         WIFI_TEST_CMD                   0x15                            //wifi功能测试
#define         GET_WIFI_STATUS_CMD             0x16                            //获取wifi状态
#define         FACTORY_SET_CMD                 0x17                            //恢复出厂设置
#define         INFORM_DEV_DEV_DEL_CMD          0x18                            //报告移除状态
#define         LOCAL_SUBDEV_DEL_CMD            0x19                            //本地删除子设备
#define         LOCAL_ADD_SUBDEV_LIMIT_CMD      0x1a                            //本地允许/关闭添加子设备
#define         GET_MODULE_REMAIN_MEMORY_CMD    0x1b                            //获取模块内存
#define         QUR_SUBDEV_LIST                 0x1c                            //查询子设备列表(在接收处理一个个包的时候有点问题)
#define         UPDATE_START_CMD                0x1d                            //网关启动升级
#define         UPDATE_TRANS_CMD                0x1e                            //网关升级传输中
#define         SUBDEV_START_UPGRADE_CMD        0x1f                            //子设备启动升级
#define         SUBDEV_TRANS_CMD                0x20                            //子设备升级包传输
#define         QUR_SUBDEV_VER_CMD              0x21                            //查询子设备版本号
#define         UPDATE_SUBDEV_ONLINE_STATE      0x2a

//=============================================================================
#define VERSION                 0x00                                            //协议版本号
#define PROTOCOL_HEAD           0x07                                            //固定协议头长度
#define FRAME_FIRST             0x55
#define FRAME_SECOND            0xaa
//============================================================================= 
SYSTEM_EXTERN volatile unsigned char wifi_queue_buf[PROTOCOL_HEAD + WIFI_UART_QUEUE_LMT];              //串口队列缓存
SYSTEM_EXTERN volatile unsigned char wifi_uart_rx_buf[PROTOCOL_HEAD + WIFI_UART_RECV_BUF_LMT];         //串口接收缓存
SYSTEM_EXTERN volatile unsigned char wifi_uart_tx_buf[PROTOCOL_HEAD + WIFIR_UART_SEND_BUF_LMT];        //串口发送缓存

SYSTEM_EXTERN volatile unsigned char *queue_in;
SYSTEM_EXTERN volatile unsigned char *queue_out;

SYSTEM_EXTERN volatile unsigned char stop_update_flag;                                                 //停止一切数据上报

SYSTEM_EXTERN volatile unsigned char stop_subdev_update_flag;                                          //停止正在升级的子设备数据上报

#ifndef WIFI_CONTROL_SELF_MODE
SYSTEM_EXTERN volatile unsigned char reset_wifi_flag;                                                  //重置wifi标志(TRUE:成功/FALSE:失败)
SYSTEM_EXTERN volatile unsigned char set_wifimode_flag;                                                //设置WIFI工作模式标志(TRUE:成功/FALSE:失败)
SYSTEM_EXTERN volatile unsigned char wifi_work_state;                                                  //wifi模块当前工作状态
#endif

/*****************************************************************************
函数名称 : set_wifi_uart_byte
功能描述 : 写wifi_uart字节
输入参数 : dest:缓存区其实地址;
           byte:写入字节值
返回参数 : 写入完成后的总长度
*****************************************************************************/
unsigned short set_wifi_uart_byte(unsigned short dest, unsigned char byte);

/*****************************************************************************
函数名称 : set_wifi_uart_buffer
功能描述 : 写wifi_uart_buffer
输入参数 : dest:目标地址
           src:源地址
           len:数据长度
返回参数 : 无
*****************************************************************************/
unsigned short set_wifi_uart_buffer(unsigned short dest, unsigned char *src, unsigned short len);

/*****************************************************************************
函数名称 : wifi_uart_write_frame
功能描述 : 向wifi串口发送一帧数据
输入参数 : fr_type:帧类型
           len:数据长度
返回参数 : 无
*****************************************************************************/
void wifi_uart_write_frame(unsigned char fr_type, unsigned short len);

/*****************************************************************************
函数名称 : get_check_sum
功能描述 : 计算校验和
输入参数 : pack:数据源指针
           pack_len:计算校验和长度
返回参数 : 校验和
*****************************************************************************/
unsigned char get_check_sum(unsigned char *pack, unsigned short pack_len);

/*****************************************************************************
函数名称 : data_handle
功能描述 : 数据帧处理
输入参数 : offset:数据起始位
返回参数 : 无
*****************************************************************************/
void data_handle(unsigned short offset);

/*****************************************************************************
函数名称 : get_queue_total_data
功能描述 : 读取队列内数据
输入参数 : 无
返回参数 : 无
*****************************************************************************/
unsigned char get_queue_total_data(void);

/*****************************************************************************
函数名称 : Queue_Read_Byte
功能描述 : 读取队列1字节数据
输入参数 : 无
返回参数 : 无
*****************************************************************************/
unsigned char Queue_Read_Byte(void);

#endif
  
  
